package com.mycode.memento19;

import com.mycode.memento19.resolve.Chessman;
import com.mycode.memento19.resolve.MementoCaretaker;
import com.mycode.memento19.resolve.MementoListCaretaker;

/**
 * 备忘录模式（Memento Pattern）
 *     提供了一种状态恢复的实现机制，使得用户可以方便地回到一个特定的历史步骤，当新的状态无效或者存在问题时，可以使用暂时存储起来的备忘录将其状态复原
 *
 * 主要优点：
 *     1、提供了一种状态恢复的实现机制，使得用户可以方便地回到一个特定的历史步骤，当新的状态无效或者存在问题时，可以使用暂时存储起来的备忘录将状态复原
 *     2、备忘录实现了对信息的封装，一个备忘录对象是一种原发器对象状态的表示，不会被其他代码所改动。可以采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作
 *
 * 主要缺点：
 *     1、资源消耗过大，如果需要保存的原发器类的成员变量太多，就不可避免地需要占用大量的存储空间，每保存一次对象的状态都需要消耗一定的系统资源
 *
 * 使用场景：
 *     1、保存一个对象在某一个时刻的全部状态或部分状态，以后需要时就能够恢复到先前的状态，实现撤销操作
 *     2、防止外界对象破坏一个对象历史状态的封装性，避免将对象历史状态的实现细节暴露给外界对象
 */
public class Bootstrap {

    public static void main(String[] args) {
        MementoListCaretaker mementoListCaretaker = new MementoListCaretaker();

        MementoCaretaker caretaker = new MementoCaretaker();
        Chessman chess = new Chessman("车", 1, 1);
        display(chess);
        // 保存状态
        caretaker.setMemento(chess.save());
        chess.setY(4);
        display(chess);
        // 保存状态
        caretaker.setMemento(chess.save());
        display(chess);
        chess.setX(5);
        display(chess);
        System.out.println("------- 悔棋 ----------");
        // 恢复状态
        chess.restore(caretaker.getMemento());
        display(chess);
        chess.restore(caretaker.getMemento());
        display(chess);
    }

    public static void display(Chessman chess) {
        System.out.println("棋子" + chess.getLabel() + "当前位置为：第" + chess.getX() + "行第" + chess.getY() + "列。");
    }

    public static void redo(Chessman chess) {
        System.out.println("------------ 撤销悔棋");
    }
}
